package com.woniu.inlet.timer;

import com.alibaba.fastjson.JSON;
import com.woniu.adapter.PersonalFixedAdapter;
import com.woniu.adapter.ProductBuyAdapter;
import com.woniu.inlet.web.vo.FixedMsgVo;
import com.woniu.outlet.client.FinancePayFeign;
import com.woniu.outlet.client.FinanceUsercenterFeign;
import com.woniu.outlet.client.SendOrderMsgToPayFeign;
import com.woniu.outlet.client.mq.FixedInputBuyMQ;
import com.woniu.outlet.mysql.po.PersonalFixedMySQL;
import com.woniu.outlet.mysql.po.ProductBuyMySQL;
import com.woniu.service.domain.FundOrGoldBuyDto;
import com.woniu.utils.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 基金定投
 * 生成有定投需求用户的订单信息
 */
@Component
@Slf4j
@Transactional
public class FundFixedInvestmentTimer {

    @Autowired
    private PersonalFixedAdapter fixedAdapter;

    @Autowired
    private ProductBuyAdapter buyAdapter;

    @Autowired
    private SendOrderMsgToPayFeign msgToPayFeign;

    /**
     * 每天0:00:01秒 查询有定投需求的用户信息，
     * 生成订单
     * （发送订单信息时间为每日23:30点）
     */
    @Scheduled(cron = "1 0 0 ? * *") //每天0:00:01秒  --> "1 0 0 ? * *" 查询有定投需求的用户信息
    public void generateFixedOrderMsg() {
        fixedInputStart(0);
    }


    /**
     * 每天14:00 再次查询有定投需求的用户信息。
     * 用来满足【每天0:01 查询有定投需求的用户信息】时，
     * 用户余额不足的后，进行充值的用户，
     * 再次为其生成订单
     */
    @Scheduled(cron = "0 0 14 ? * *") //每天14:00 再次查询有定投需求的用户信息
    public void againGenerateFixedOrderMsg() {
        fixedInputStart(-2);
    }

    /**
     * 创建定投单子
     * @param status
     */
    public void fixedInputStart(int status){
        //得到今日是几号和周几
        int day=DateUtil.getDayForNumber();
        int week=DateUtil.getDayForWeek();
        log.debug("发送定投信息开始，开始时间{}，今天周{}",DateUtil.getBuyTime(),week);
        List<PersonalFixedMySQL> meetMonthOrWeekFixedDate = fixedAdapter.findMeetMonthOrWeekFixedDate(day,week,status);
        List<FixedMsgVo> vos=new ArrayList<>();
        if(meetMonthOrWeekFixedDate.size()==0){
            log.debug("没有要定投的单子");
        }else{
            int count=0;
            for (PersonalFixedMySQL p : meetMonthOrWeekFixedDate) {
                String buyId = buyAdapter.addFixedInputOrder(p);
                log.debug("先生成订单");
                FixedMsgVo vo = fixedAdapter.getFixedMsgById(p.getId(),Integer.valueOf(buyId));
                vos.add(vo);
                count++;
            }
            while (true) {
                try {
                    msgToPayFeign.sendMessage(FixedInputBuyMQ.EXCHANGE, FixedInputBuyMQ.ROUTING_KEY, JSON.toJSONString(vos));
                    break;
                } catch (Exception e) {
                    e.printStackTrace();
                    log.debug("发送定投消息失败,重试");
                }
            }
            log.debug("定投消息发送成功，今日定投的订单有[{}]条",count);
        }
    }


    /**
     * 每天15:00 --> "0 0 15 ? * *" 修改选择了当日定投的单子
     */
    @Scheduled(cron = "0 59 11 ? * *")
    public void updateStatus_1To0() {
        //String yesterdayDate="2021-04-28";
        log.debug("[修改选择了当日定投的单子]任务开始，今日日期{}",DateUtil.getSendDate());
        //修改状态
        fixedAdapter.updateStatus(DateUtil.getSendDate());
        log.debug("[修改选择了当日定投的单子]任务结束");
    }

}
